package kin.system.util;

import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;

import org.springframework.http.HttpInputMessage;
import org.springframework.http.HttpOutputMessage;
import org.springframework.http.MediaType;
import org.springframework.http.converter.AbstractHttpMessageConverter;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.http.converter.HttpMessageNotWritableException;
import org.springframework.util.FileCopyUtils;

public class UTF8StringHttpMessageConverter extends AbstractHttpMessageConverter<String> {  
  
    public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");  
  
    private final List<Charset> availableCharsets;  
  
    private boolean writeAcceptCharset = true;  
  
    public UTF8StringHttpMessageConverter() {  
    	
    	
        super(new MediaType("application", "json", DEFAULT_CHARSET), MediaType.ALL);  
        System.out.println("json");
        this.availableCharsets = new ArrayList<Charset>(Charset.availableCharsets().values());  
    }  
  
    public void setWriteAcceptCharset(boolean writeAcceptCharset) {  
        this.writeAcceptCharset = writeAcceptCharset;  
    }  
  
    @Override  
    public boolean supports(Class<?> clazz) {  
        return String.class.equals(clazz);  
    }  
  
    
  
    @Override  
    protected Long getContentLength(String s, MediaType contentType) {  
        Charset charset = getContentTypeCharset(contentType);  
        try {  
            return (long) s.getBytes(charset.name()).length;  
        }  
        catch (UnsupportedEncodingException ex) {  
            throw new InternalError(ex.getMessage());  
        }  
    }  
  
   
  
    protected List<Charset> getAcceptedCharsets() {  
        return this.availableCharsets;  
    }  
  
    private Charset getContentTypeCharset(MediaType contentType) {  
        if (contentType != null && contentType.getCharSet() != null) {  
            return contentType.getCharSet();  
        }  
        else {  
            return DEFAULT_CHARSET;  
        }  
    }

	@Override
	protected String readInternal(Class<? extends String> arg0,
			HttpInputMessage arg1) throws IOException,
			HttpMessageNotReadableException {
		  Charset charset = getContentTypeCharset(arg1.getHeaders().getContentType());  
	        return FileCopyUtils.copyToString(new InputStreamReader(arg1.getBody(), charset));  
	}

	@Override
	protected void writeInternal(String arg0, HttpOutputMessage arg1)
			throws IOException, HttpMessageNotWritableException {
		 if (writeAcceptCharset) {  
			 arg1.getHeaders().setAcceptCharset(getAcceptedCharsets());  
	        }  
	        Charset charset = getContentTypeCharset(arg1.getHeaders().getContentType());  
	        FileCopyUtils.copy(arg0, new OutputStreamWriter(arg1.getBody(), charset));  
		
	}  
} 